home *** CD-ROM | disk | FTP | other *** search
/ Disc to the Future 2 / Disc to the Future Part II Programmer's Reference (Wayzata Technology)(6013)(1992).bin / MAC / THINKC / 4_0 / UUPC3 / MAC_SPEC / UNIX_LIB / RENAME.C < prev    next >
C/C++ Source or Header  |  1989-07-29  |  3KB  |  138 lines

  1. /* Copyright (C) 1984 by Manx Software Systems, Inc. */
  2.  
  3. #ifndef    THINK_C
  4. #include    <quickdraw.h>
  5. #include    <pb.h>
  6.  
  7. #define        _DEBUG
  8. #include    <max/debug.h>
  9. #endif    THINK_C
  10. #include    <errno.h>
  11. #include <stdio.h>
  12.  
  13. long setdir( path, dir, name )
  14. char * path;
  15. char * dir;
  16. char * name;
  17. {
  18.     CInfoPBRec cpb;
  19.     int err;
  20.  
  21.     if (*path == '/') (void)
  22.     splitname( path, dir, name );
  23.     
  24. #ifdef TEST
  25.     fprintf( stderr, "setdir: \"%s\" \"%s\" \"%s\"\n", name, dir, path );
  26. #endif
  27.     CtoPstr( dir );
  28.     cpb.dirInfo.ioNamePtr = (StringPtr)dir;
  29.     
  30.     cpb.dirInfo.ioVRefNum = 0;
  31.     cpb.dirInfo.ioFDirIndex = 0;
  32.     cpb.dirInfo.ioDrDirID = 0L;
  33.  
  34.     if ((err = PBGetCatInfo( &cpb, 0 )) != 0 ) {
  35.  
  36. #ifdef TEST
  37.     fprintf( stderr, "setdir: err %d\n", err );
  38. #endif
  39.         
  40.     }
  41.  
  42.     return( cpb.dirInfo.ioDrDirID );
  43.  
  44. }
  45.  
  46. rename(old, new)
  47. char *old, *new;
  48. {
  49.     register int i, err;
  50.     long int freeb;
  51.     int vrefnum;
  52.     
  53.     HParamBlockRec    pb;
  54.     CMovePBRec         cm;
  55.         
  56.     char nbuf[255], ndir[64], nname[32];
  57.     char obuf[255], odir[64], oname[32];
  58.  
  59.  
  60.     importpath(obuf, old);
  61.     importpath(nbuf, new);
  62.     
  63. #ifdef TEST
  64.     fprintf( stderr, "rename: obuf|%s -> nbuf|%s\n", obuf, nbuf );
  65. #endif
  66.  
  67.     /* get dir refnums, fix path names, get dir name, and name */
  68.     cm.ioNewDirID = setdir( nbuf, ndir, nname );
  69.     cm.ioDirID = setdir( obuf, odir, oname );    
  70.     
  71.     /* use name only */
  72.     if ( cm.ioDirID != cm.ioNewDirID ) {
  73. #ifdef TEST
  74.         fprintf( stderr, "rename: catmove\n" );
  75.         fprintf( stderr, "rename: %ld|%s -> %ld|%s\n", 
  76.                 pbcm.cm.ioDirID, obuf, pbcm.cm.ioNewDirID, ndir );
  77. #endif
  78.         /* use full path name including volume name */
  79.         CtoPstr(obuf);
  80.         cm.ioNamePtr = (StringPtr)obuf;
  81.         cm.ioNewName = (StringPtr)ndir;
  82.         cm.ioVRefNum = 0;        /* use default directory */
  83.         err = PBCatMove(&cm, FALSE);
  84.     }
  85.     else
  86.         err = 0;
  87.     if (err) {
  88.         if (err == -48)
  89.             err = EEXIST;
  90.         errno = err;
  91.         return(-1);
  92.     }
  93.     else {
  94. #ifdef TEST
  95.     fprintf( stderr, "rename: rename\n" );
  96.     fprintf( stderr, "rename: %ld|%s -> %ld|%s\n", 
  97.             pbcm.cm.ioDirID, oname, pbcm.cm.ioNewDirID, nname);
  98. #endif
  99.         CtoPstr(oname);
  100.         pb.ioParam.ioNamePtr = (StringPtr)oname;
  101.         pb.ioParam.ioVersNum = 0;
  102.         CtoPstr(nname);
  103.         pb.ioParam.ioMisc = nname;
  104.         pb.fileParam.ioDirID =  cm.ioNewDirID;
  105.         err = PBHRename(&pb, FALSE);
  106.         if (err) {
  107.             if (err == -48)
  108.                 err = EEXIST;
  109.             errno = err;
  110.             return(-1);
  111.         }
  112.         else
  113.             return(0);
  114.     }
  115. }
  116.  
  117. #ifdef TEST
  118. #include <errno.h>
  119.  
  120. main()
  121. {
  122.     char command[100];
  123.  
  124.     char f1[100], f2[100];
  125.  
  126.     while(gets(command) != NULL) {
  127.         sscanf( command, "%s%s", f1, f2 );
  128.  
  129.         fprintf( stderr, "test: %s %s\n", f1, f2 );
  130.  
  131.         if ( rename( f1, f2 ) == 0 )
  132.             fprintf( stderr, "test: OK\n\n" );
  133.         else
  134.             fprintf( stderr, "test: ERROR %d\n\n", errno );
  135.     }
  136. }
  137. #endif
  138.